/**
 * 
 */
package pl.marekbar.baza;

import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import pl.marekbar.Aplikacja;
import pl.marekbar.Data;
import pl.marekbar.R;
import pl.marekbar.widoki.Asoc;

/**
 * @author marekbar1985
 * 
 */
public class Krolik
{
	public static String SAMICA = "samica";
	public static String SAMIEC = "samiec";
	public static String NIESPRAWDZONE = "nieznana";

	public static String NAZWA_TABELI = "kroliki";

	public static final String POLE_ID = "id";
	public static final String POLE_NAZWA = "nazwa";
	public static final String POLE_PLEC = "plec";
	public static final String POLE_OPIS = "opis";
	public static final String POLE_DATA_URODZENIA = "data_urodzenia";
	public static final String POLE_DATA_ZAKUPU = "data_zakupu";
	public static final String POLE_DATA_SPRZEDAZY = "data_srzedazy";
	public static final String POLE_WAGA = "waga";
	public static final String POLE_POCHODZENIE = "pochodzenie";
	public static final String POLE_UBOJ = "uboj";
	public static final String POLE_ZYJE = "zyje";
	public static final String POLE_SPRZEDANY = "sprzedany";
	public static final String POLE_OJCIEC = "ojciec";
	public static final String POLE_MATKA = "matka";
	public static final String POLE_ZDJECIE = "zdjecie";

	private static MenedzerBazy menedzer = null;
	private static SQLiteDatabase baza = null;
	private static boolean czyBazaJestOtwarta = false;

	private Integer id;
	private String nazwa;
	private String plec;
	private String opis;
	private String data_urodzenia;
	private String data_zakupu;
	private String data_sprzedazy;
	private String waga;
	private String pochodzenie;
	private Integer uboj;
	private Integer zyje;
	private Integer sprzedany;
	private Integer ojciec;
	private Integer matka;
	private String zdjecie;



	public Krolik()
	{

	}



	public Krolik(String nazwa, String plec, String opis, String dataUrodzenia,
			String dataZakupu, String waga, String pochodzenie,
			boolean czyNaUboj, boolean czyZyje, boolean czySprzedany,
			Integer matka, Integer ojciec, String zdjecie)
	{
		this.ustaw(nazwa, plec, opis, dataUrodzenia, dataZakupu, waga,
				pochodzenie, czyNaUboj, czyZyje, czySprzedany, matka, ojciec,
				zdjecie);
	}



	public static void otworzBaze(Context kontekst)
	{
		if (!Krolik.czyBazaJestOtwarta)
		{
			Krolik.menedzer = new MenedzerBazy(kontekst);
			Krolik.baza = menedzer.getWritableDatabase();
			Krolik.czyBazaJestOtwarta = true;
		}
	}



	public static void zamknijBaze()
	{
		if (Krolik.czyBazaJestOtwarta)
		{
			Krolik.menedzer.close();
			Krolik.czyBazaJestOtwarta = false;
		}
	}



	public static String pobierzSqlTabeli()
	{
		List<Pole> pola = new ArrayList<Pole>();
		pola.add(new Pole(Krolik.POLE_ID, PolaBazy.KLUCZ));
		pola.add(new Pole(Krolik.POLE_NAZWA, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_PLEC, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_OPIS, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_DATA_URODZENIA, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_DATA_ZAKUPU, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_DATA_SPRZEDAZY, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_WAGA, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_POCHODZENIE, PolaBazy.STRING));
		pola.add(new Pole(Krolik.POLE_UBOJ, PolaBazy.BOOLEAN));
		pola.add(new Pole(Krolik.POLE_ZYJE, PolaBazy.BOOLEAN));
		pola.add(new Pole(Krolik.POLE_SPRZEDANY, PolaBazy.BOOLEAN));
		pola.add(new Pole(Krolik.POLE_MATKA, PolaBazy.KLUCZ_OBCY));
		pola.add(new Pole(Krolik.POLE_OJCIEC, PolaBazy.KLUCZ_OBCY));
		pola.add(new Pole(Krolik.POLE_ZDJECIE, PolaBazy.SCIEZKA));
		return PolaBazy.utworzTabele(Krolik.NAZWA_TABELI, pola);
	}



	public Integer pobierzId()
	{
		return this.id;
	}



	public void ustawId(Integer id)
	{
		this.id = id;
	}



	public String pobierzNazwa()
	{
		return this.nazwa;
	}



	public String pobierzPlec()
	{
		return this.plec;
	}



	public String pobierzOpis()
	{
		return this.opis;
	}



	public Data pobierzDataUrodzenia()
	{
		return new Data(this.data_urodzenia);
	}



	public Data pobierzDataZakupu()
	{
		return new Data(this.data_zakupu);
	}



	public Data pobierzDataSprzedazy()
	{
		return new Data(this.data_sprzedazy);
	}



	public String pobierzWaga()
	{
		return this.waga;
	}



	public String pobierzPochodzenie()
	{
		return this.pochodzenie;
	}



	public boolean pobierzCzyNaUboj()
	{
		return this.uboj == 0 ? false : true;
	}



	public boolean pobierzCzyZyje()
	{
		return this.zyje == 0 ? false : true;
	}



	public boolean pobierzCzySprzedany()
	{
		return this.sprzedany == 0 ? false : true;
	}



	public Integer pobierzOjciec()
	{
		return this.ojciec;
	}



	public Integer pobierzMatka()
	{
		return this.matka;
	}



	public String pobierzZdjecieGlowne()
	{
		return this.zdjecie;
	}



	public void ustawNazwa(String nazwa)
	{
		this.nazwa = nazwa;
	}



	public void ustawPlec(String plec)
	{
		this.plec = plec;
	}



	public void ustawOpis(String opis)
	{
		this.opis = opis;
	}



	public void ustawDataUrodzenia(Data data_urodzenia)
	{
		this.data_urodzenia = data_urodzenia.toString();
	}



	public void ustawDataZakupu(Data data_zakupu)
	{
		this.data_zakupu = data_zakupu.toString();
	}



	public void ustawDataSprzedazy(Data data_sprzedazy)
	{
		this.data_sprzedazy = data_sprzedazy.toString();
	}



	public void ustawWaga(String waga)
	{
		this.waga = waga;
	}



	public void ustawPochodzenie(String pochodzenie)
	{
		this.pochodzenie = pochodzenie;
	}



	public void ustawCzyNaUboj(boolean czyNaUboj)
	{
		this.uboj = czyNaUboj == true ? 1 : 0;
	}



	public void ustawCzyZyje(boolean czyZyje)
	{
		this.zyje = czyZyje == true ? 1 : 0;
	}



	public void ustawCzySprzedany(boolean czySprzedany)
	{
		this.sprzedany = czySprzedany == true ? 1 : 0;
	}



	public void ustawOjciec(Integer ojciec)
	{
		this.ojciec = ojciec;
	}



	public void ustawMatka(Integer matka)
	{
		this.matka = matka;
	}



	public void ustawZdjecieGlowne(String zdjecieGlowne)
	{
		this.zdjecie = zdjecieGlowne;
	}



	public void ustaw(String nazwa, String plec, String opis,
			String dataUrodzenia, String dataZakupu, String waga,
			String pochodzenie, boolean czyNaUboj, boolean czyZyje,
			boolean czySprzedany, Integer matka, Integer ojciec, String zdjecie)
	{
		this.nazwa = nazwa;
		this.opis = opis;
		this.plec = plec;
		this.data_urodzenia = dataUrodzenia;
		this.data_zakupu = dataZakupu;
		this.waga = waga;
		this.pochodzenie = pochodzenie;
		this.uboj = czyNaUboj == true ? 1 : 0;
		this.zyje = czyZyje == true ? 1 : 0;
		this.sprzedany = czySprzedany == true ? 1 : 0;
		this.matka = matka;
		this.ojciec = ojciec;
		this.zdjecie = zdjecie;
	}



	public boolean dodaj(Context kontekst)
	{
		ContentValues wartosci = new ContentValues();
		wartosci.put(Krolik.POLE_NAZWA, this.nazwa);
		wartosci.put(Krolik.POLE_PLEC, this.plec);
		wartosci.put(Krolik.POLE_OPIS, this.opis);
		wartosci.put(Krolik.POLE_DATA_URODZENIA, this.data_urodzenia);
		wartosci.put(Krolik.POLE_DATA_ZAKUPU, this.data_zakupu);
		wartosci.put(Krolik.POLE_DATA_SPRZEDAZY, this.data_sprzedazy);
		wartosci.put(Krolik.POLE_WAGA, this.waga);
		wartosci.put(Krolik.POLE_POCHODZENIE, this.pochodzenie);
		wartosci.put(Krolik.POLE_UBOJ, this.uboj);
		wartosci.put(Krolik.POLE_ZYJE, this.zyje);
		wartosci.put(Krolik.POLE_SPRZEDANY, this.sprzedany);
		wartosci.put(Krolik.POLE_MATKA, this.matka);
		wartosci.put(Krolik.POLE_OJCIEC, this.ojciec);
		wartosci.put(Krolik.POLE_ZDJECIE, this.zdjecie);

		Krolik.otworzBaze(kontekst);
		long kursor = Krolik.baza.insert(Krolik.NAZWA_TABELI, "", wartosci);
		Krolik.zamknijBaze();
		Aplikacja.info("WSTAWIONY WIERSZ: " + kursor);

		if (kursor == -1)
		{
			return false;
		}
		else
		{
			return true;
		}
	}



	public static List<Krolik> pobierzKroliki(Context kontekst)
	{
		return Krolik.pobierzKroliki(kontekst, null);
	}



	public static List<Krolik> pobierzSamice(Context kontekst)
	{
		List<Pole> filtry = new ArrayList<Pole>();
		filtry.add(new Pole(Krolik.POLE_PLEC, Krolik.SAMICA, TypPola.TEKST));
		return Krolik.pobierzKroliki(kontekst, filtry);
	}



	public static List<Krolik> pobierzSamce(Context kontekst)
	{
		List<Pole> filtry = new ArrayList<Pole>();
		filtry.add(new Pole(Krolik.POLE_PLEC, Krolik.SAMIEC, TypPola.TEKST));
		return Krolik.pobierzKroliki(kontekst, filtry);
	}



	public static List<Krolik> pobierzKroliki(Context kontekst,
			List<Pole> filtry)
	{
		Krolik.otworzBaze(kontekst);
		List<Krolik> kroliki = new ArrayList<Krolik>();
		String SQL = "SELECT * FROM " + Krolik.NAZWA_TABELI;
		if (filtry != null && filtry.size() > 0)
		{
			SQL += " WHERE ";
			for (Pole filtr : filtry)
			{
				SQL += filtr.pobierzKlucz() + "=";
				TypPola typ = filtr.pobierzTyp();
				int i = 1;
				if (typ == TypPola.TEKST)
				{
					SQL += "\"" + (String) filtr.pobierzWartosc() + "\""
							+ ((filtry.size() == i) ? "" : ", ");
				}
				else if (typ == TypPola.LICZBA)
				{
					SQL += Integer.toString(((Integer) filtr.pobierzWartosc()))
							+ ((filtry.size() == i) ? "" : ", ");
				}
				i++;
			}
		}
		Aplikacja.info(SQL);
		Cursor kursor = Krolik.baza.rawQuery(SQL, null);
		while (kursor.moveToNext())
		{
			kroliki.add(Krolik.CursorToKrolik(kursor));
		}

		Krolik.zamknijBaze();
		return kroliki;
	}



	public static Krolik CursorToKrolik(Cursor kursor)
	{
		Krolik k = new Krolik();
		k.ustawId(kursor.getInt(kursor.getColumnIndex(Krolik.POLE_ID)));
		k.ustawNazwa(kursor.getString(kursor.getColumnIndex(Krolik.POLE_NAZWA)));
		k.ustawCzyNaUboj(kursor.getInt(kursor.getColumnIndex(Krolik.POLE_UBOJ)) == 0 ? false
				: true);
		k.ustawCzySprzedany(kursor.getInt(kursor
				.getColumnIndex(Krolik.POLE_SPRZEDANY)) == 0 ? false : true);
		k.ustawCzyZyje(kursor.getInt(kursor.getColumnIndex(Krolik.POLE_ZYJE)) == 0 ? false
				: true);
		k.ustawDataSprzedazy(new Data(kursor.getString(kursor
				.getColumnIndex(Krolik.POLE_DATA_SPRZEDAZY))));
		k.ustawDataUrodzenia(new Data(kursor.getString(kursor
				.getColumnIndex(Krolik.POLE_DATA_URODZENIA))));
		k.ustawDataZakupu(new Data(kursor.getString(kursor
				.getColumnIndex(Krolik.POLE_DATA_ZAKUPU))));
		k.ustawMatka(kursor.getInt(kursor.getColumnIndex(Krolik.POLE_MATKA)));
		k.ustawOjciec(kursor.getInt(kursor.getColumnIndex(Krolik.POLE_OJCIEC)));
		k.ustawOpis(kursor.getString(kursor.getColumnIndex(Krolik.POLE_OPIS)));
		k.ustawPlec(kursor.getString(kursor.getColumnIndex(Krolik.POLE_PLEC)));
		k.ustawPochodzenie(kursor.getString(kursor
				.getColumnIndex(Krolik.POLE_POCHODZENIE)));
		k.ustawWaga(kursor.getString(kursor.getColumnIndex(Krolik.POLE_WAGA)));
		k.ustawZdjecieGlowne(kursor.getString(kursor
				.getColumnIndex(Krolik.POLE_ZDJECIE)));
		return k;
	}



	public boolean uaktualnij()
	{
		return true;
	}



	public boolean usun(Context kontekst)
	{
		return Krolik.usun(kontekst, this.pobierzId());
	}



	public static boolean usun(Context kontekst, int idKrolika)
	{
		Krolik.otworzBaze(kontekst);
		int odpowiedz = Krolik.baza.delete(Krolik.NAZWA_TABELI,
				"id=" + Integer.toString(idKrolika), null);
		Krolik.zamknijBaze();
		return odpowiedz == 0 ? false : true;
	}



	public static List<Asoc> pobierzOpisKrolika(Context kontekst, int id)
	{
		Aplikacja.ustawKontekst(kontekst);
		Krolik k = Krolik.pobierz(kontekst, id);

		List<Asoc> lista = new ArrayList<Asoc>();
		if (k == null)
		{
			lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_brak_danych),""));
			return lista;
		}
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_podsumowanie),""));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_id),Integer.toString(k.pobierzId())));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_nazwa), k.pobierzNazwa()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_plec), k.pobierzPlec()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_opis), k.pobierzOpis()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_du), k.pobierzDataUrodzenia().toString()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_dz), k.pobierzDataZakupu().toString()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_ds), k.pobierzDataSprzedazy().toString()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_waga), k.pobierzWaga()));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_uboj), k.pobierzCzyNaUboj() ? "TAK" : "NIE"));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_zyje), k.pobierzCzyZyje() ? "TAK" : "NIE"));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_sprzedany), k.pobierzCzySprzedany() ? "TAK" : "NIE"));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_ojciec), Integer.toString(k.pobierzOjciec())));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_matka), Integer.toString(k.pobierzMatka())));
		lista.add(new Asoc(Aplikacja.tekst(R.string.podglad_zdjecie), k.pobierzZdjecieGlowne()));
		return lista;
	}



	public static Krolik pobierz(Context kontekst, int id)
	{
		List<Pole> filtry = new ArrayList<Pole>();
		filtry.add(new Pole(Krolik.POLE_ID, id, TypPola.LICZBA));
		List<Krolik> kroliki = Krolik.pobierzKroliki(kontekst, filtry);
		if (kroliki.size() == 0)
		{
			return null;
		}
		else
		{
			return kroliki.get(0);
		}
	}

}
